
//todo
// 假设有k个人质和k个绑匪围成一圈。人质的编号从1到k，绑匪的编号从k+1到2k。
// 从编号1开始，每次从其中选出第m个人(隔m-1选出一人)出列。
// 希望求出m的最小值，使得最先出列的k个人都是绑匪，即都是编号从k+1到2k的人。
#include "iostream"
#include "vector"
#include "unordered_map"
#include "algorithm"
struct Constructor{
    std::vector<int> vec;
    int w;
    int last_x=0;
    int last_y=0;
    void set(int x,int y,int v){
        vec[y*w+x]=v;
        last_x=x;
        last_y=y;
    }
    int get(int x,int y){
        return vec[y*w+x];
    }
    Constructor(int n){
        w=n;
        vec.resize(n*n,0);
        for (int i = 1; i <=n*n ; ++i) {
            put(i);
        }
    }

    void put(int n){
        if(n==1){
            set(w/2,0,1);
        }else{
            int wx=last_x+1;
            if(wx==w){
                wx=0;
            }
            int wy=last_y-1;
            if(wy==-1){
                wy=w-1;
            }
            if(//规则5
                    (last_x==w-1&&last_y==0)||
                    (get(wx,wy)!=0)
                    ){
                set(last_x,last_y+1,n);
            }else{
                set(wx,wy,n);
            }
        }
    }
    void print(){
        for(int i=0;i<w;i++){
            for(int j=0;j<w;j++){
                if(j!=0){
                    printf(" ");
                }
                printf("%d", get(j,i));
            }
            printf("\n");
        }
    }
};
void invert(int n){
    Constructor c(n);
    c.print();
}

int main() {
    int m,n;//行，列
//    int
//    is_huiwen(1441,10);]
//bool  first=true;
    while (std::cin >> m) {
//        first= false;
        invert(m);
        printf("\n");
    }
//    while(1){}
    return 0;
}

